SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [LIQSalarioFamiliarBackup07012008] 
@Agente INT,
@Servicio INT,
@Plaza INT,
@Resultado DECIMAL(18,4) OUTPUT,
@idLiquidacion INT,
@DiasALiquidar INT,
@DiasDelPeriodo INT,
@Desde DATETIME,
@Hasta DATETIME
AS 

SET NOCOUNT ON


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- VER
-- RESTRICCION Solo cobran los que  trabajaron mas de 15 dias.
--
-- REGISTRO DE ACTUALIZACIONES
-- 21/11/2005 - Se agregaron parametros @Desde y @Hasta para manejo de Fechas en Titulares y Suplentes
-- 21/11/2005 - Se eliminan las variables @FDesde y @FHasta y son reemplazadas por los parámetros @Desde y @Hasta
-- 09/07/2006 - Los parametros se obtienen de la funcion fnObtenerValorDeParametro con la fecha que corresponda.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET DATEFORMAT DMY 

DECLARE @conyuge INT
DECLARE @hijos INT
DECLARE @hijosIncapacitados INT
DECLARE @familianumerosa INT
DECLARE @nacimientos INT
DECLARE @adopcion INT
DECLARE @prenatal INT
DECLARE @escolaridad INT
DECLARE @EscolaridadPolimodal INT
DECLARE @AsignacionFamiliar DECIMAL(18,4)
DECLARE @Afiliacion INT, @horas INT, @regimensalarial  INT, @organizacion INT, @situacionrevista INT
DECLARE @certificado INT
DECLARE @tipocertificado INT
DECLARE @TipoLiquidacion INT
DECLARE @NroError INT
DECLARE @SubOrganizacion INT
DECLARE @EscolaridadIncapacidad INT
DECLARE @EscolaridadPolimodalIncapacidad INT
DECLARE @TotalPrenatal DECIMAL(18,4)
DECLARE @SueldoBasico DECIMAL(18,4)
DECLARE @CabeceraDeLiquidacion INT
DECLARE @ImportePorHijo DECIMAL(18,4)
DECLARE @ImportePorHijoIncapacitado DECIMAL(18,4)
DECLARE @ImportePorFamiliaNumerosa DECIMAL(18,4)
DECLARE @ImportePorEscolaridad DECIMAL(18,4)
DECLARE @ImportePorEscolaridadIncapacitado DECIMAL(18,4)
DECLARE @ImportePorEscolaridadPolimodal DECIMAL(18,4)
DECLARE @ImportePorEscolaridadPolimodalIncapacitado DECIMAL(18,4)
DECLARE @ImportePorConyuge DECIMAL(18,4)
DECLARE @ImportePorCertificado DECIMAL(18,4)
DECLARE @Mes INT
DECLARE @Anio INT
DECLARE @CantidadPagadas INT
DECLARE @CantidadTopeAPagar INT
DECLARE @CantidadAPagar INT
DECLARE @MesesPostVencimiento INT
DECLARE @ValidezHasta DATETIME, @FPP DATETIME, @ValidezDesde DATETIME
DECLARE @Error INT
DECLARE @MesesdeAsignacionFamiliarAdicional VARCHAR(12)
DECLARE @CantidadMinDiasAsignacionFamiliar INT
DECLARE @CantidaddeAsignacionFamiliarAdicionalAPagar DECIMAL(18,4)


SELECT @ImportePorHijo = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImportePorHijoSalarioFamiliar', @Hasta))
SELECT @ImportePorHijoIncapacitado = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImportePorHijoIncapacitadoSalarioFamiliar', @Hasta))
SELECT @ImportePorFamiliaNumerosa = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImportePorFamiliaNumerosaSalarioFamiliar', @Hasta))
SELECT @ImportePorEscolaridad = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImportePorEscolaridadPrimariaSalarioFamiliar', @Hasta))
SELECT @ImportePorEscolaridadIncapacitado = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImportePorEscolaridadPrimariaIncapacitado', @Hasta))
SELECT @ImportePorEscolaridadPolimodal = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImportePorEscolaridadPolimodalSalarioFamiliar', @Hasta))
SELECT @ImportePorEscolaridadPolimodalIncapacitado = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImportePorEscolaridadPolimodalIncapacitado', @Hasta))
SELECT @ImportePorConyuge = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImportePorConyugeSalarioFamiliar', @Hasta))
SELECT @MesesdeAsignacionFamiliarAdicional = CONVERT(VARCHAR(12), dbo.fnObtenerValorDeParametro ('MesesdeAsignacionFamiliarAdicional', @Hasta))  	 --Modificado Adriana 20-7
SELECT @CantidadMinDiasAsignacionFamiliar = CONVERT(INT, dbo.fnObtenerValorDeParametro ('CantidadMinDiasAsignacionFamiliar', @Hasta))  	--Modificado Adriana 20-7
SELECT @CantidaddeAsignacionFamiliarAdicionalAPagar = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('CantidaddeAsignacionFamiliarAdicionalAPagar', @Hasta))

SELECT  @NroError = 0, @AsignacionFamiliar = 0
SELECT @ImportePorCertificado = 0
SELECT @Error = 0

SELECT @Afiliacion = idAfiliacion FROM tb_Afiliaciones WHERE idAgente = @Agente
SELECT @horas= horas, @regimensalarial = regimensalarial, @SubOrganizacion = SubOrganizacion FROM tb_Plazas WHERE idPlaza = @Plaza
SELECT @Organizacion = ubicacionOrig, @SituacionRevista = SituacionRevista FROM tb_ServiciosAgentes WHERE idservicioAgente =  @Servicio
SELECT @TipoLiquidacion = Tipo, @CabeceraDeLiquidacion = IdCabeceraLiquidacion FROM tb_Liquidaciones WHERE idLiquidacion = @idLiquidacion


---------------Agregado Adriana
DECLARE @DiasTrabajadosTotales  INT
DECLARE @TotalAsignacionaPagar DECIMAL(18,4)
DECLARE @MontoPagadoSalarioLiqAnterior DECIMAL(18,4)
DECLARE @Nombre VARCHAR(50)
DECLARE @OrganizacionCobro INT
DECLARE @PagarPorPrivado CHAR(1)
DECLARE @DiasTrabajadosPublico INT 

SET @TotalAsignacionaPagar = 0
SET @MontoPagadoSalarioLiqAnterior = 0 
SET @DiasTrabajadosPublico = 0

--Veo que para este servicio le esté liquidando haberes..(que trabajó)
SELECT @SueldoBasico = MontoHaberes FROM tb_RegistroDeLiquidaciones WHERE Concepto = 4 AND Servicio = @Servicio AND Liquidacion = @idLiquidacion

-- Busco si ya no se le pago para el PERIODO en alguna otra Liquidacion del mismo tipo
SELECT TOP 1 @MontoPagadoSalarioLiqAnterior = R.MontoHaberes
FROM tb_RegistroDeLiquidaciones R 
  INNER JOIN tb_Liquidaciones L ON L.idLiquidacion = R.Liquidacion 
  INNER JOIN tb_CabeceraDeLiquidacion CL ON CL.IdCabeceraDeLiquidacion = L.IDCabeceraLiquidacion 
	WHERE R.Concepto=12 AND R.MontoHaberes>0 
	  AND (Cl.DesdeSuplente IS NOT NULL AND Cl.HastaSuplente IS NOT NULL) 
	  AND Cl.TipoDeLiquidacion = @TipoLiquidacion
	  AND R.Agente = @Agente
	  AND ((@Desde BETWEEN CL.Desde AND  CL.Hasta) OR (@Desde BETWEEN CL.DesdeSuplente AND  CL.HastaSuplente)) 
	  

--- Si al Servicio a Liquidar se le esta pagando algo y no se le pago antes el concepto en otra Liquidacion Anterior
IF (@SueldoBasico >0)  AND @MontoPagadoSalarioLiqAnterior=0
   BEGIN

      	PRINT 'Ingreso por el if (@SueldoBasico >0)  AND @MontoPagadoSalarioLiqAnterior=0'
	--- que los días superen el minimo para pagar asignación familiar. --- ESTO SE MIRA EN TODOS LOS SERVICIOS DEL AGENTE PARA EL PERIODO	
	SET @DiasTrabajadosTotales = dbo.fnLiqDiasTrabajados(@Agente, @Desde, @Hasta,0, NULL)
	
	IF  (@DiasTrabajadosTotales >@CantidadMinDiasAsignacionFamiliar )
		BEGIN 
			PRINT 'Ingreso por el if @DiasTrabajadosTotales >@CantidadMinDiasAsignacionFamiliar'

			IF EXISTS(SELECT TOP 1 IdFamiliar FROM Tb_FamiliaresACargo WHERE idAgente = @Agente) OR (EXISTS (SELECT TOP  1  IdCertificado FROM Tb_CertificadosConceptosLiquidacion WHERE Agente = @Agente AND Habilitado = 'S') )
				BEGIN

					PRINT 'Ingreso por el IF que tiene Conyuge o Hijos o Certificado'
					--- Llamar PA que nos retorna el CUISE por el que debe Cobrar y si dicho CUISE es el elegido por el Agente en Privada

					SET @OrganizacionCobro = 0
					SET @PagarPorPrivado = 'N'

					EXEC dbo.LiqObtenerOrganizacionPagoConcepto @Agente, @Organizacion,@Desde,@Hasta,12, @TipoLiquidacion, @OrganizacionCobro OUTPUT, @PagarPorPrivado OUTPUT

					PRINT '----------'
					
					PRINT '@Agente'
					PRINT @Agente
					PRINT '@Organizacion :'
					PRINT @Organizacion

					PRINT '@OrganizacionCobro :'
					PRINT @OrganizacionCobro
					PRINT @PagarPorPrivado

					PRINT '----------'

					IF @Organizacion = @OrganizacionCobro
						BEGIN

							PRINT 'Ingreso por el IF @Organizacion = @OrganizacionCobro'
							--  Buscar cuandos dias trabajo en Servicio Publico
							SET @DiasTrabajadosPublico = dbo.fnLiqDiasTrabajados(@Agente, @Desde, @Hasta, 1, NULL)							

							IF (@PagarPorPrivado = 'S') OR (@PagarPorPrivado = 'N' AND @DiasTrabajadosPublico < @CantidadMinDiasAsignacionFamiliar)
								BEGIN

									------ PAGAR 
									PRINT 'CALCULANDO SALARIO FAMILIAR'

									SELECT @Mes = MONTH(@Desde), @Anio = YEAR(@Desde)

									IF @SituacionRevista IN (1,2,3)
										DELETE CP FROM tb_CertificadosDeLiquidacionPagados CP INNER JOIN tb_CertificadosConceptosLiquidacion ON IdCertificado = Certificado 
										WHERE Mes = @Mes AND Anio = @Anio AND Agente = @Agente
									ELSE
										DELETE CP FROM tb_CertificadosDeLiquidacionPagados CP INNER JOIN tb_CertificadosConceptosLiquidacion ON IdCertificado = Certificado 
										WHERE Mes = @Mes AND Anio = @Anio AND Agente = @Agente AND SituacionRevista = 4

									-- Extraer todos lo certificados validos para el agente
									DECLARE Certificados CURSOR FOR 
									SELECT C.idCertificado, TipoCertificado, ValidezDesde, ValidezHasta, FPP
										FROM Tb_CertificadosConceptosLiquidacion C INNER JOIN tb_TiposCertificadosConceptos T ON T.IdCertificado = C.TipoCertificado
										WHERE Agente = @Agente  AND Habilitado = 'S'
									  	     AND CantidadAPagar > (SELECT ISNULL(SUM(Cantidad), 0) FROM tb_CertificadosDeLiquidacionPagados WHERE Certificado = C.TipoCertificado)
										     AND  @Desde <= DATEADD(MONTH, MesesPostVencimiento, ValidezHasta)  

									SELECT @Conyuge = 0
									SELECT @AsignacionFamiliar = 0, @Escolaridad = 0, @EscolaridadPolimodal = 0, @HijosIncapacitados = 0, @FamiliaNumerosa = 0
	
									--  Buscar Conyuge 
									IF EXISTS (SELECT TOP 1 IdFamiliar FROM Tb_FamiliaresACargo WHERE idAgente = @Agente AND Parentezco = 3 AND Sexo = 2)
										SELECT @Conyuge = COUNT(*) FROM Tb_FamiliaresACargo WHERE idAgente = @Agente AND Parentezco = 3 AND Sexo = 2 AND CorrespondeAsignacionFamiliar = 'S'
	
									SELECT @Hijos =  COUNT(idFamiliar) FROM Tb_FamiliaresACargo WHERE IdAgente = @Agente AND Parentezco = 2 AND CorrespondeAsignacionFamiliar = 'S'
										AND ( (datediff(hour, FechaDeNacimiento, @Hasta)/8766 <= 15  AND NivelActual is NULL OR NivelActual = 8) OR ( datediff(Hour, FechaDeNacimiento, @Hasta)/8766 <= 23 AND NivelActual is not NULL AND NivelActual <> 8) ) AND esDiscapacitado = 'N'
	
									SELECT @HijosIncapacitados = COUNT(idFamiliar) FROM tb_FamiliaresACargo WHERE idAgente = @Agente AND Parentezco = 2 AND CorrespondeAsignacionFamiliar = 'S' AND esDiscapacitado = 'S'
	
									SELECT @FamiliaNumerosa = count(idFamiliar) FROM tb_FamiliaresACargo WHERE idAgente =  @Agente AND Parentezco = 2 AND CorrespondeAsignacionFamiliar = 'S'
										AND ( (esDiscapacitado = 'N' AND datediff(hour, FechaDeNacimiento, @Hasta)/8766 <= 21 ) OR (esDiscapacitado='S') )
	
									SELECT @escolaridad = count(idFamiliar) FROM tb_FamiliaresACargo WHERE idAgente = @Agente AND Parentezco = 2 AND CorrespondeAsignacionFamiliar = 'S' AND (nivelactual = 6 OR nivelactual = 1 OR nivelactual=5)
										AND datediff(Hour, FechaDeNacimiento, @Hasta)/8766 <= 23 AND NivelActual is not NULL AND EsDiscapacitado = 'N'
	
									SELECT @escolaridadPolimodal = count(idFamiliar) FROM tb_FamiliaresACargo WHERE idAgente = @Agente AND Parentezco = 2 AND CorrespondeAsignacionFamiliar = 'S' AND nivelactual in (7,3,4,9,2)
										AND datediff(Hour, FechaDeNacimiento, @Hasta)/8766 <= 23 AND NivelActual is not NULL AND EsDiscapacitado = 'N'
	
									SELECT @escolaridadIncapacidad = count(idFamiliar) FROM tb_FamiliaresACargo WHERE idAgente = @Agente AND Parentezco = 2 AND CorrespondeAsignacionFamiliar = 'S' AND (nivelactual = 6 OR nivelactual = 1 OR nivelactual=5 ) AND EsDiscapacitado = 'S'
										AND datediff(Hour, FechaDeNacimiento, @Hasta)/8766 <= 23 AND NivelActual is not NULL 
	
									SELECT @EscolaridadPolimodalIncapacidad = count(idFamiliar) FROM tb_FamiliaresACargo WHERE idAgente = @Agente AND Parentezco = 2 AND CorrespondeAsignacionFamiliar = 'S' AND nivelactual in (7,3,4,9,2)
										AND datediff(Hour, FechaDeNacimiento, @Hasta)/8766 <= 23 AND NivelActual is not NULL AND EsDiscapacitado = 'S'
	
									--  CALCULOS CERTIFICADOS 

									-- HAY QUE VER LOS RETROACTIVOS
									OPEN Certificados
									FETCH NEXT FROM Certificados INTo @Certificado, @TipoCertificado, @ValidezDesde, @ValidezHasta, @FPP
									WHILE @@FETCH_STATUS = 0
									BEGIN
								
										--- NOTAS IMPORTANTES
										-- Que pasa con los Suplentes por el tema de la Fecha Mes y Anio a borrar  Listo
										-- Que pasa con paAsignarOrganizacionParaSalarioFamiliar Listo
										-- Que pasa con los Agentes que trabajan en Publica NO SE PUEDE CONTROLAR
								
										SELECT @CantidadPagadas = ISNULL(SUM(Cantidad), 0) FROM tb_CertificadosDeLiquidacionPagados WHERE Certificado = @Certificado
										SELECT @CantidadTopeAPagar = CantidadAPagar,@MesesPostVencimiento = MesesPostVencimiento FROM tb_TiposCertificadosConceptos WHERE idCertificado = @TipoCertificado
								
										IF @CantidadPagadas = 0
										BEGIN
											SELECT @CantidadAPagar = DATEDIFF(MONTH, @ValidezDesde, @Desde)+1
											IF @CantidadAPagar > @CantidadTopeAPagar
												SELECT @CantidadAPagar = @CantidadTopeAPagar
											
											SELECT @ImportePorCertificado = @CantidadAPagar * ImportePorCertificado + @ImportePorCertificado FROM tb_TiposCertificadosConceptos WHERE idCertificado = @TipoCertificado
										END
										ELSE
										BEGIN
											SELECT @ImportePorCertificado = ImportePorCertificado + @ImportePorCertificado FROM tb_TiposCertificadosConceptos WHERE idCertificado = @TipoCertificado
											SELECT @CantidadAPagar = 1
										END
								
										INSERT INTO tb_CertificadosDeLiquidacionPagados (Certificado, Mes, Anio, Cantidad, SituacionRevista) VALUES (@Certificado, @Mes, @Anio, @CantidadAPagar, @SituacionRevista) 
										SELECT @Error = @@Error
										IF @Error <> 0
											SELECT @NroError = @Error
								
										IF @NroError <> 0
											 INSERT INTo tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) values
											(@Agente, 12, 'No pudo agregar el Pago Del Certificado', getdate(), @idLiquidacion, @Organizacion, @Servicio, @CabeceraDeLiquidacion, @NroError)
										
										FETCH NEXT FROM Certificados INTo @Certificado, @TipoCertificado, @ValidezDesde, @ValidezHasta, @FPP
									END 
									CLOSE certificados
									DEALLOCATE certificados
	
									------ CALCULOS

									IF @conyuge > 0 SELECT @AsignacionFamiliar = @AsignacionFamiliar + @ImportePorConyuge
	
									IF @hijos > 0 SELECT @AsignacionFamiliar = @AsignacionFamiliar + (@hijos * @ImportePorHijo)										IF @hijosIncapacitados > 0 SELECT @AsignacionFamiliar = @AsignacionFamiliar + (@hijosIncapacitados * @ImportePorHijoIncapacitado)
	
									IF @familianumerosa >= 3 SELECT @AsignacionFamiliar = @AsignacionFamiliar + (@familianumerosa - 2) * @ImportePorFamiliaNumerosa
	
									IF @Escolaridad > 0 SELECT @AsignacionFamiliar = @AsignacionFamiliar + ( @escolaridad * @ImportePorEscolaridad) 
	
									IF @escolaridadPolimodal > 0  SELECT @AsignacionFamiliar = @AsignacionFamiliar + ( @escolaridadPolimodal * @ImportePorEscolaridadPolimodal) 
	
									IF @EscolaridadIncapacidad > 0 SELECT @AsignacionFamiliar = @AsignacionFamiliar + (@EscolaridadIncapacidad * @ImportePorEscolaridadIncapacitado)
	
									IF @EscolaridadPolimodalIncapacidad > 0 SELECT @AsignacionFamiliar = @AsignacionFamiliar + (@EscolaridadPolimodalIncapacidad * @ImportePorEscolaridadPolimodalIncapacitado)

									IF (SELECT OrganizacionLiquidadora FROM tb_SubOrganizaciones WHERE idSubOrganizacion = @SubOrganizacion) Is Not NULL
										SELECT @Organizacion = OrganizacionLiquidadora FROM tb_SubOrganizaciones WHERE idSubOrganizacion = @SubOrganizacion
	
									IF  SUBSTRING(@MesesdeAsignacionFamiliarAdicional, Month(@Desde), 1) = '1' 	
										SELECT @AsignacionFamiliar = @AsignacionFamiliar*@CantidaddeAsignacionFamiliarAdicionalAPagar
		
		
									SET @TotalAsignacionaPagar = @AsignacionFamiliar + @ImportePorCertificado


									------ FIN PAGAR 
								END 
						END 

				END 
	
		END

    END


---Se puso solo un Insert, ya que se acumula en @TotalAsignacionaPagar lo que se debe Liquidar, puede ser 0
INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista, DiasLiquidados, SubOrganizacion)
	VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, 12, NULL, NULL, NULL, NULL, NULL, NULL, @horas, 0, @idLiquidacion, 0, @TotalAsignacionaPagar, @Organizacion, NULL, @Servicio, @SituacionRevista, @diasALiquidar, @SubOrganizacion)

SELECT @Error = @@Error
IF @Error <> 0
	SELECT @NroError = @Error

IF @NroError <> 0
     BEGIN 
              SELECT @Nombre = Nombres FROM tb_Agentes WHERE idAgente = @Agente

	 INSERT INTo tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) values
	(@Agente, 12, convert(VARCHAR,@NroError), getdate(), @idLiquidacion, @Organizacion, @Servicio, @CabeceraDeLiquidacion, @NroError)
    END	


---------------FIN  Agregado Adriana
GO
